// 函子
class Container {
  constructor(value) {
    this._value = value
  }
  map(fn) {
    return new Container(fn(this._value))
  }
}
// map返回的是一个新的函子对象
// 不会对外传递值! 处理值就给map对象传递处理值的函数
let r = new Container(5).map((x) => x + 1).map((x) => x * x)
console.log(r) //Container { _value: 36 }
console.log(r._value) // 36
// 所以说返回的还是一个Container对象，也就是值没有显示的传递出来，需要使用._value获取

// new操作封装 new太面向对象了
// 用静态方法of封装new
class Container2 {
  // 静态方法of里面封装new
  static of(value) {
    return new Container2(value)
  }
  constructor(value) {
    this._value = value
  }
  map(fn) {
    // 通过of来调用
    return Container2.of(fn(this._value))
  }
}

let r2 = Container2.of(5)
  .map((x) => x + 2)
  .map((x) => x * x)
console.log(r2) // Container { _value: 49 }

// Container.of(null).map((x) => x.toUpperCase())
console.log(Container2.of(process).map((x) => x.execPath)._value)
// C:\Program Files\nodejs\node.exe
// Container { _value: 'C:\\Program Files\\nodejs\\node.exe' }
// null就会异常 副作用! 如何控制副作用??
